package com.rpframework.core.json;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.rpframework.utils.EntityUtils;
import com.rpframework.utils.StringUtil;

/**
 * json数据异常处理
 * 
 * @author 刘兴
 */
public class JsonExceptionHandling {
	/**
	 * 异常信息
	 */
	public static final Map<Integer, Class<? extends JsonException>> exs = new HashMap<>();

	public final static Logger log = LoggerFactory.getLogger(JsonExceptionHandling.class);

	static {
		exs.put(0, ParameterException.class);
		exs.put(1, FailException.class);
		exs.put(2, EmptyException.class);
		exs.put(3, LoginExpiredException.class);
	}

	public boolean handing(Exception e) {
		return false;
	}

	/**
	 * 参数错误
	 * 
	 * @param message
	 *            消息
	 */
	public static void parameter(String message) {
		getException(message, 0);
	}

	/**
	 * 参数错误
	 * 
	 * @param message
	 *            消息
	 */
	public static void parameter(String message, String... name) {
		if (StringUtil.isBlank(name)) {
			parameter(message);
		}
	}

	/**
	 * 获取一次并抛出
	 * 
	 * @param message
	 *            消息
	 * @param key
	 *            键
	 * @return 异常信息
	 * @throws Exception
	 *             获取出错
	 */
	public static JsonException getException(String message, Integer key) {
		RuntimeException instance = null;
		try {
			Class<? extends JsonException> exceptionClass = exs.get(key);
			Constructor<? extends JsonException> constructor = exceptionClass.getConstructor(String.class);
			instance = constructor.newInstance(message);
		} catch (Exception e) {
			log.error("创建实例失败", e);
			throw new JsonException("创建实例失败", e);
		}
		throw instance;
	}

	/**
	 * 获取一次并抛出
	 * 
	 * @param key
	 *            键
	 * @return 异常信息
	 * @throws Exception
	 *             获取出错
	 */
	public static RuntimeException getException(Integer key) {
		throw getException(null, key);
	}

	/**
	 * 失败
	 * 
	 * @param message
	 *            消息
	 */
	public static void fail(String message) {
		getException(message, 1);
	}

	/**
	 * 失败
	 * 
	 * @param message
	 *            消息
	 */
	public static void empty(String message) {
		getException(message, 2);
	}

	/**
	 * 登陆过期
	 * 
	 * @param message
	 *            消息
	 */
	public static void loginExpired(String message) {
		codeEx(JsonCodeEnum.OVERTIME, message);
	}

	/**
	 * 登陆过期
	 * 
	 * @param message
	 *            消息
	 */
	public static void loginExpired() {
		codeEx(JsonCodeEnum.OVERTIME, "用户未登录或已过期");
	}

	/**
	 * 失败
	 * 
	 * @param message
	 *            消息
	 */
	public static void empty() {
		JsonResp jsonResp = JsonResp.toEmpty();
		getException(jsonResp.getMsg(), 2);
	}

	/**
	 * 失败
	 */
	public static void fail() {
		fail(null);
	}

	/**
	 * 参数错误
	 */
	public static void parameter() {
		parameter(null);
	}

	/**
	 * 失败
	 * 
	 * @param message
	 *            消息
	 * @return JSON对象
	 */
	public static JsonResp toFail(String message) {
		JsonResp json = new JsonResp();
		json.setCode(JsonCodeEnum.FAIL);
		json.success(message);
		return json;
	}

	/**
	 * 失败
	 * 
	 * @return JSON对象
	 */
	public static JsonResp toFail() {
		return toFail(null);
	}

	/**
	 * 成功
	 * 
	 * @param message
	 *            消息
	 * @return JSON对象
	 */
	public static JsonResp toSu(String message) {
		JsonResp json = new JsonResp();
		json.setCode(JsonCodeEnum.SUCCESS);
		json.success(message);
		return json;
	}

	/**
	 * 成功
	 * 
	 * @return JSON对象
	 */
	public static JsonResp toSu() {
		return toSu(null);
	}

	/**
	 * String转JSON处理对象
	 * 
	 * @param jsonStr
	 * @return JSON对象
	 */
	public static JsonResp parse(String jsonStr) {
		JsonResp json = null;
		try {
			Gson mgson = new Gson();
			json = mgson.fromJson(jsonStr, JsonResp.class);
		} catch (Exception e) {
			log.info("json转换失败", e);
		}
		return json;
	}

	/**
	 * 自定义异常方式
	 * 
	 * @param jsonCodeEnum
	 *            code
	 * @param message
	 *            消息
	 */
	public static void codeEx(JsonCodeEnum jsonCodeEnum, String message) {
		JsonException codeException = new JsonException();
		JsonResp jsonResp = codeException.getJsonResp();
		jsonResp.setCode(jsonCodeEnum);
		jsonResp.setMsg(message);
		throw codeException;
	}

	/**
	 * 自定义异常方式
	 * 
	 * @param jsonCodeEnum
	 *            code
	 */
	public static void codeEx(JsonCodeEnum jsonCodeEnum) {
		codeEx(jsonCodeEnum, null);
	}

	/**
	 * 字段是否为空
	 * 
	 * @param model
	 *            实体类
	 * @param fields
	 *            排除字段
	 */
	public static void isNull(Object model, String... fields) {
		try {
			if (!EntityUtils.isBlank(model, fields)) {
				parameter("参数不完整,请检查");
			}
		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
				| InvocationTargetException e) {
			fail();
		}
	}

	/**
	 * 字段是否为空 排除主键为id
	 * 
	 * @param model
	 *            实体类
	 */
	public static void isNullById(Object model) {
		isNull(model, "id");
	}

	/**
	 * 字段是否为空 排除主键为id
	 * 
	 * @param model
	 *            实体类
	 */
	public static void isNull(Object model) {
		isNull(model, new String[] {});
	}
}
